import config from "./config"
import http from "./http"

/**
 * 选择图片并上传
 * @param {string} type - 上传的类型，对应 config.UPLOAD_PATH 中的键
 * @returns {Promise<{imageUrl: string}>} - 返回包含图片URL的Promise
 */
export const chooseImageFun = (type) => {
  const pathUrl = config.UPLOAD_PATH[type]
  if (!pathUrl) {
    return Promise.reject(new Error('上传路径配置不存在'))
  }
  
  const token = uni.getStorageSync('token')
  
  // 显示加载提示
  const showLoading = () => uni.showLoading({ title: '上传中...', mask: true })
  // 隐藏加载提示
  const hideLoading = () => uni.hideLoading()
  
  return new Promise((resolve, reject) => {
    // 选择图片
    uni.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success: (res) => {
        const file = res.tempFilePaths[0]
        showLoading()
        
        // 上传图片
        uploadFile(file, pathUrl, token)
          .then(data => {
            resolve({ imageUrl: data })
          })
          .catch(err => {
            reject(err)
          })
          .finally(() => {
            hideLoading()
          })
      },
      fail: (err) => {
        console.error('选择图片失败:', err)
        reject(err)
      }
    })
  })
}

/**
 * 上传文件到服务器
 * @param {string} filePath - 文件本地路径
 * @param {string} pathUrl - 上传路径
 * @param {string} token - 用户token
 * @returns {Promise<string>} - 返回图片URL
 */
const uploadFile = (filePath, pathUrl, token) => {
  return new Promise((resolve, reject) => {
    uni.uploadFile({
      url: `${config.baseUrl}${pathUrl}`,
      filePath,
      name: 'file',
      header: {
        "content-type": "multipart/form-data",
        "token": `mini- ${token}`
      },
      success: (res) => {
        if (res.statusCode === 200) {
          try {
            const { code, message, data } = JSON.parse(res.data)
            
            // 处理业务错误
            if (code === '-5015') {
              http.toAuth()
              return reject(new Error('未实名认证'))
            }
            
            if (code === '-500') {
              http.isMssage(message)
              return reject(new Error(message || '上传失败'))
            }
            
            resolve(data)
          } catch (err) {
            console.error('解析响应数据失败:', err)
            reject(new Error('服务器响应格式错误'))
          }
        } else {
          reject(new Error(`服务器响应错误 ${res.statusCode}`))
        }
      },
      fail: (err) => {
        console.error('上传请求失败:', err)
        reject(new Error('网络请求失败，请检查网络连接'))
      }
    })
  })
}